
#include "Monstre.h"

void monInit(Monstre* p_monstre, Categorie catego, int x, int y)
{
    p_monstre->categorie = catego;


    posSetX(&p_monstre->position, x);
    posSetY(&p_monstre->position, y);

    p_monstre->direction = bas;

    p_monstre->coeurs = 2;
    p_monstre->vitesse = 1; /*en fait pas le temps de gérer ça */
    p_monstre->etat = balade;


}


Monstre* monCree(Categorie categorie, int x, int y)
{
    Monstre* p_monstre;
    p_monstre = (Monstre*) malloc(sizeof (Monstre));
    monInit(p_monstre, categorie, x, y);
    return p_monstre;
}



void monTeleporte(Monstre* p_monstre, int x, int y)
{
    posSetX(&p_monstre->position, x);
    posSetY(&p_monstre->position, y);
}




int monGetPosX(const Monstre* p_monstre)
{
    return(posGetConstX(&p_monstre->position));
}

int monGetPosY(const Monstre* p_monstre)
{
    return(posGetConstY(&p_monstre->position));
}

const Position* monGetConstPosition(const Monstre* p_monstre)
{
    return &p_monstre->position;
}

Position monGetPosition(const Monstre* p_monstre)
{
    return p_monstre->position;
}


const Direction monGetConstDirection(const Monstre* p_monstre)
{
    return p_monstre->direction;
}

const Categorie monGetConstCategorie(const Monstre* p_monstre)
{
    return p_monstre->categorie;
}


int monGetNbCoeurs(const Monstre* p_monstre)
{
    return (p_monstre->coeurs);
}



void monChangeNbCoeurs(Monstre* p_monstre, int modificateur)
{
    p_monstre->coeurs = p_monstre->coeurs + modificateur;

    /* on vérifie qu'il n'est pas mort au passage */
    if (p_monstre->coeurs <= 0)
    {
        p_monstre->etat = mort;
    }
}




const EtatMonstre monGetEtat(const Monstre* p_monstre)
{
    return (p_monstre->etat);
}

void monSetEtat(Monstre* p_monstre, EtatMonstre nouvel_etat)
{
    p_monstre->etat = nouvel_etat;
}



Position monDeplAleatoire(Monstre* p_monstre)
{

    int i = rand()%5;
    Position pos_monstre = monGetPosition(p_monstre);

	switch(i)
	{
	case 0 : posAugmenteX(&pos_monstre ,+1);break;
	case 1 : posAugmenteX(&pos_monstre ,-1);break;
	case 2 : posAugmenteY(&pos_monstre ,+1);break;
	case 3 : posAugmenteY(&pos_monstre ,-1);break;
	case 4 : posAugmenteX(&pos_monstre ,0);break;
	}

    return pos_monstre;
}


Position monDeplExcite(Monstre* p_monstre, Position* p_pos)
{

    int i = rand()%2; /* pour choisir au "hasard" entre s'approcher en x ou en y */

    Position pos_monstre = monGetPosition(p_monstre);

	int difx=posGetX(&pos_monstre)-posGetX(p_pos);
    int dify=posGetY(&pos_monstre)-posGetY(p_pos);


	if (i==0) /* on s'approche en x */
	{
		if (difx>0) posAugmenteX(&pos_monstre ,-1);
		else posAugmenteX(&pos_monstre ,+1);
	}
	else /* on s'approche en y */
	{
		if (dify>0) posAugmenteY(&pos_monstre ,-1);
		else posAugmenteY(&pos_monstre ,+1);
	}

    return pos_monstre;
}
